#ifndef __CLAVEPRIMARIA_H__
#define __CLAVEPRIMARIA_H__

#include "Tipos.h"

class CClavePrimaria 
{
public:
	TIPO_DATO codProd;
	TIPO_DATO nroBloque; //referencia al bloque dentro del archivo de datos
	CClavePrimaria();
	CClavePrimaria(string registro, TIPO_DATO nroBlock);
	CClavePrimaria(TIPO_DATO codigo,TIPO_DATO nroBloqueIn);	
	CClavePrimaria(CClavePrimaria &primaria);
	CClavePrimaria(string registro);
	CClavePrimaria(TIPO_DATO);
	virtual ~CClavePrimaria(){}
	
	TIPO_DATO getTamanio(){return TAMANIO_COD_PROD + TAMANIO_NRO_BLOQ;}
	TIPO_DATO getTamanioNodo(){return TAMANIO_COD_PROD;}
	TIPO_DATO getClave(){return codProd;}
	TIPO_DATO getCodProducto(){return codProd;}
	TIPO_DATO getCodProducto(int indice){return 0;}
	TIPO_DATO getNroBloque(){return nroBloque;}
	TIPO_DATO getIndice(){return 0;}
	void setIndice(int indice){}
	bool obtenerNroBloque(TIPO_DATO &nroBloqueOut,fstream &archivo){return true;}
	bool eliminarElemVector(TIPO_DATO claveIn,fstream &archivo){return false;}	
	int transformar(string datos, TIPO_DATO &pos);
	string desTransformar();
	string desTransformarNodo();
	int transformarNodo(string datos, TIPO_DATO &pos);

	CClavePrimaria& operator=(CClavePrimaria& clave);
	bool operator==(const CClavePrimaria &clave) const;
	bool operator<(const CClavePrimaria &clave) const;		
    bool operator()(CClavePrimaria inicio, CClavePrimaria fin)
    {
	    return inicio.getClave() < fin.getClave();
    }	
    void mostrar();
	void insertarVectorSec(TIPO_DATO codProdIn,fstream &archivo){}
};
/*-----------------------------------------------------------*/
CClavePrimaria::CClavePrimaria(TIPO_DATO clave,TIPO_DATO descripcion)
{
	this->codProd = clave;
	nroBloque = descripcion;
}
/*-----------------------------------------------------------*/

CClavePrimaria::CClavePrimaria(TIPO_DATO codigo)
{
	this->codProd = codigo;
	nroBloque = 0;
}
/*-----------------------------------------------------------*/
CClavePrimaria::CClavePrimaria(string registro)
{
	codProd = atoi(registro.substr(0,5).c_str());
	nroBloque = 0;
}
/*-----------------------------------------------------------*/
CClavePrimaria::CClavePrimaria(string registro, TIPO_DATO nroBlock)
{
	//codProd = string2TipoDato(registro.substr(0,4));
	codProd = atoi(registro.substr(0,5).c_str());
	nroBloque = nroBlock;
}
/*-----------------------------------------------------------*/
CClavePrimaria::CClavePrimaria()
{
	codProd = 0;
	nroBloque = 0;
}
/*-----------------------------------------------------------*/
CClavePrimaria::CClavePrimaria(CClavePrimaria &primaria)
{
	codProd = primaria.codProd;
	nroBloque = primaria.nroBloque;	
}
/*-----------------------------------------------------------*/
/*devuelve la cantidad de byte leidos*/
int CClavePrimaria::transformar(string datos, TIPO_DATO &posicion){	

		if(datos.compare("")==0)
		{
			codProd = 0;
			nroBloque = 0;			
		}
		else
		{
			codProd = string2TipoDato(datos.substr(posicion,TAMANIO_COD_PROD));
//			if(codProd == 633)
//				cout<<"No deberia pasar"<<endl;
			posicion+=TAMANIO_COD_PROD;
			nroBloque = string2TipoDato(datos.substr(posicion,TAMANIO_NRO_BLOQ));			
			posicion+=TAMANIO_NRO_BLOQ;
		}
		return TAMANIO_COD_PROD + TAMANIO_NRO_BLOQ;
	}
/*-----------------------------------------------------------*/
string CClavePrimaria::desTransformar()
{
	string dato="";
	//char numero[10];
	//dato+=itoa(codProd,numero,10);
//	if(codProd == 633)
//		cout<<"No deberia pasar"<<endl;
	dato+=convertirChar(codProd,TAMANIO_COD_PROD);
	//dato+=itoa(nroBloque,numero,10);
	dato+=convertirChar(nroBloque,TAMANIO_NRO_BLOQ);
	return dato;
}
/*-----------------------------------------------------------*/
/*devuelve la cantidad de byte leidos*/
int CClavePrimaria::transformarNodo(string datos, TIPO_DATO &posicion){	

		if(datos.compare("") == 0)
		{
			codProd = 0;	
		}
		else
		{
			codProd = string2TipoDato(datos.substr(posicion,TAMANIO_COD_PROD));
			if(codProd == 633)
				cout<<"No deberia pasar"<<endl;
			posicion += TAMANIO_COD_PROD;
//B+		nroBloque = string2TipoDato(datos.substr(posicion,TAMANIO_NRO_BLOQ));			
//B+		posicion += TAMANIO_NRO_BLOQ;
		}
		return TAMANIO_COD_PROD; //B+ + TAMANIO_NRO_BLOQ;
	}
/*-----------------------------------------------------------*/
string CClavePrimaria::desTransformarNodo()
{
	string dato = "";
	//char numero[10];
	//dato+=itoa(codProd,numero,10);
	if(codProd == 633)
		cout<<"No deberia pasar"<<endl;
	dato += convertirChar(codProd,TAMANIO_COD_PROD);
	//dato+=itoa(nroBloque,numero,10);
//B+	dato += convertirChar(nroBloque,TAMANIO_NRO_BLOQ);
	return dato;
}


/*-----------------------------------------------------------*/
CClavePrimaria& CClavePrimaria::operator=(CClavePrimaria& clave)
{
	if(this==&clave)
		return *this;
	codProd = clave.codProd;
	nroBloque = clave.nroBloque;
	return *this;	
}
/*-----------------------------------------------------------*/
bool CClavePrimaria::operator==(const CClavePrimaria &clave) const
{
	return codProd == clave.codProd;
}
/*-----------------------------------------------------------*/
bool CClavePrimaria::operator<(const CClavePrimaria &clave) const
{
	return codProd < clave.codProd;
}
/*-----------------------------------------------------------*/
void CClavePrimaria::mostrar() /* = std::cout*/
{				
	cout<<"Codigo: "<<std::setw(5)<<std::setfill('0')<<this->codProd<<" Bloque nro: "<<this->nroBloque<<endl;	
}
/*-----------------------------------------------------------*/

#endif //__CLAVEPRIMARIA_H__
